<?php

/*
 * Table/PeriodeSemaineTable.php
 */

namespace RHX\Model\Table;

use Zend\Db\TableGateway\AbstractTableGateway;
use Zend\Db\Adapter\Adapter;
use Zend\Db\ResultSet\ResultSet;
use RHX\Model\Object\Semaine;
use RHX\Model\Object\Periode;
use RHX\Model\Object\PeriodeSemaine;

class PeriodeSemaineTable extends AbstractTableGateway {
    protected $table = 'rh_periode_semaine';

    public function __construct(Adapter $adapter) {
	$this->adapter			 = $adapter;
	$this->resultSetPrototype	 = new ResultSet();
	$this->resultSetPrototype->setArrayObjectPrototype(new PeriodeSemaine());
	$this->initialize();
    }

    public function getAll() {
	return $this->select();
    }

    /**
     * Récupération des Semaines d'une Période
     *
     * @param int $id ID de la Période
     * @param string $order Ordre d'affichage
     * @return Collection
     */
    public function getSemainesByPeriode($id, $order = 'id ASC') {
	// Tables
	$periodeTable	 = new PeriodeTable($this->adapter);
	$semaineTable	 = new SemaineTable($this->adapter);

	// Periode
	$periode = $periodeTable->get($id);

	// ID des semaines correspondant à l'ID de la période
	$rows = $this->select(function(\Zend\Db\Sql\Select $select)use($periode, $order) {
		    $where = new \Zend\Db\Sql\Where();
		    $where->equalTo('periode_id', $periode->id);
		    $select->where($where);
		    $select->order('semaine_'.$order);
		});
	$semaineId	 = array();
	foreach ($rows as $row) {
	    $semaineId[] = $row->semaine_id;
	}

	// Semaines
	$semaines = $semaineTable->getSemaines($semaineId, $order);

	return $semaines;
    }

    /**
     * Récupérer une période à partir d'une semaine
     *
     * @param int $id
     * @return RHX\Model\Object\Periode
     */
    public function getPeriodeBySemaine($id) {
	// Table Periode
	$periodeTable = new PeriodeTable($this->adapter);

	$ps = $this->get($id);

	// Periode
	$periode = $periodeTable->get($ps->periode_id);

	return $periode;
    }

    /**
     * Récupérer une Instance de PeriodeSemaine
     *
     * @param int $id
     * @return RHX\Model\Object\PeriodeSemaine
     * @throws \Exception
     */
    public function get($id) {
	$row = $this->select(array('id' => $id))
		->current();
	if (!$row) {
	    throw new \Exception("Erreur 51 : La Periode Semaine #$id n'a pas été trouvé");
	}

	return $row;
    }

    /**
     * Sauvegarder une Instance de PeriodeSemaine
     *
     * @param \RHX\Model\Object\PeriodeSemaine $ps
     * @return int ID du dernier sauvegarde
     * @throws \Exception
     */
    public function save(PeriodeSemaine $ps) {
	$data	 = array(
	    'periode_id'	 => $ps->periode_id,
	    'semaine_id'	 => $ps->semaine_id,
	);
	$id	 = (int) $ps->id;
	if ($id == 0) {
	    $this->insert($data);

	    return $this->lastInsertValue;
	}
	elseif ($this->get($id)) {
	    $this->update($data, array('id' => $id));

	    return $id;
	}
	else {
	    throw new \Exception("Erreur 52 : La Période Semaine #$id n'a pas été sélectionné, Sauvegarde Impossible");
	}
    }

    /**
     * Effacer une PeriodeSemaine
     *
     * @param type $id
     * @return int Nombre d'enregistrement affecté
     */
    public function erase($id) {
	return $this->delete(array('id' => $id));
    }

    /**
     * Liste des semaines d'une période
     * dans le format de liste doublement chainée
     * 
     * @param int $periodeId
     * @param int $semaineId
     * @return \SplDoublyLinkedList
     */
    public function getSemainesListByPeriode($periodeId, $semaineId = null) {
	// Semaines
	$semaines = $this->getSemainesByPeriode($periodeId);
	$tableSemaine = new SemaineTable($this->getAdapter());
	$semaineRef = $tableSemaine->get($semaineId);

	// Liste doublement chainée
	$list = new \SplDoublyLinkedList();
	foreach ($semaines as $semaine) {
	    $list->push($semaine);
	    if ($semaine->lundi == $semaineRef->lundi) {
		// Sortie prématuré de la boucle
		// On a la liste des semaines avant la semaine en cours
		break;
	    }
	}
	$list->rewind();

	return $list;
    }

    /**
     * Récupérer les instances des Periodes semaines correspondant à une période
     * 
     * @param type $periodeId
     * @return ResultSet
     */
    public function getPeriodeSemaineByPeriode($periodeId) {
	return $this->select(function(\Zend\Db\Sql\Select $select)use($periodeId) {
			    $where = new \Zend\Db\Sql\Where();
			    $where->equalTo('periode_id', $periodeId);
			    $select->where($where);
			});
    }

}

?>
